package br.ifrn.tads.poo.app;
import java.util.*;

import br.ifrn.tads.poo.carro.*;
import br.ifrn.tads.poo.negocio.*;
import br.ifrn.tads.poo.pessoa.*;
import br.ifrn.tads.poo.excecao.*;
import java.text.SimpleDateFormat;

public class Main {

	public static void main(String[] args) {

	/*\
	 *	INICIALIZANDO O SISTEMA	
	\*/
		
		final Locadora locadora = Loader.iniciarLocadora();
		Scanner curto = new Scanner(System.in);
		Scanner longo = new Scanner(System.in);
		Funcionario funcionario;
		Cliente cliente = null;
		Carro carro = null;
		ArrayList<Object> lista;

		String nome, login, senha, novoLogin, novaSenha, endereco, telefone, cpf, id, cnpj, resp, modelo, placa, cor, string;
		char letra, opcao;
		boolean logado, sair = false, ok;
		int idade;
		double valor;
		Date data = null;
		SimpleDateFormat formatoData = new SimpleDateFormat("dd/MM/yyyy");

	/*\
	 *	VERIFICAÇÃO DE USUÁRIO
	\*/
		
		do {
			
			System.out.println(" _________________________________________________________________ ");
			System.out.println("|                                                                 |");
			System.out.println("|                      LOCADORA DE VEÍCULOS                       |");
			System.out.println("|       ____ _                                ____                |");
			System.out.println("|      / ___| |__   __ _ _ __ ___  _   _ ___ / ___|__ _ _ __      |");
			System.out.println("|     | |   | '_ \\ / _` | '_ ` _ \\| | | / __| |   / _` | '__|     |");
			System.out.println("|     | |___| | | | (_| | | | | | | |_| \\__ \\ |__| (_| | |        |");
			System.out.println("|      \\____|_| |_|\\__,_|_| |_| |_|\\__,_|___/\\____\\__,_|_|        |");
			System.out.println("|                                                                 |");
			System.out.println("|_________________________________________________________________|");
		
			System.out.println("\nDigite seu nome de usuário");
			System.out.print("> ");
			login = longo.nextLine();
			funcionario = locadora.verificarLogin(login);
		
			while (funcionario == null) {
				System.out.println("\n[!] Usuário não encontrado");
				System.out.println("Digite novamente seu nome de usuário");
				System.out.print("> ");
				login = longo.nextLine();
				funcionario = locadora.verificarLogin(login);
			}
		
			System.out.println("\nOlá " + funcionario.getNome() + "!\nDigite sua senha");
			System.out.print("> ");
			senha = longo.nextLine();
		
			while (!locadora.verificarSenha(funcionario, senha)) {
				System.out.println("\n[!] Senha incorreta, tente novamente");
				System.out.print("> ");
				senha = longo.nextLine();
			} 
		
			System.out.println("\nSeja bem vindo!");
			logado = true;
		
	/*\
	 *	MENU PRINCIPAL
	\*/
		
			while (logado) {
				System.out.println("");
				System.out.println(" ______________________________ ");
				System.out.println("|                              |");
				System.out.println("|        MENU PRINCIPAL        |");
				System.out.println("|______________________________|");
				System.out.println("|                              |");
				System.out.println("| 1 - Funcionários             |");
				System.out.println("| 2 - Clientes                 |");
				System.out.println("| 3 - Carros                   |");
				System.out.println("|                              |");
				System.out.println("| 4 - Reserva                  |");
				System.out.println("| 5 - Aluguel                  |");
				System.out.println("| 6 - Devolução                |");
				System.out.println("|                              |");
				System.out.println("| 7 - Logoff                   |");
				System.out.println("| 8 - Sair                     |");
				System.out.println("|______________________________|");
				System.out.println("");
				
				System.out.println("Digite a opção desejada");
				System.out.print("> ");
				opcao = curto.next().charAt(0);
				
				switch (opcao) {
		
	/*\
	 *	OPÇÃO 1	--	FUNCIONÁRIOS
	\*/
				
				case '1':
					do {
						ok = true;
						
						System.out.println("");
						System.out.println(" ____________________________");
						System.out.println("|                            |");
						System.out.println("|        FUNCIONÁRIOS        |");
						System.out.println("|____________________________|");
						System.out.println("|                            |");
						System.out.println("| 1 - Listar funcionários    |");
						System.out.println("| 2 - Cadastrar fucionário   |");
						System.out.println("|                            |");
						System.out.println("| 0 - Voltar                 |");
						System.out.println("|____________________________|");
						System.out.println("");
						
						System.out.println("Digite a opção desejada");
						System.out.print("> ");
						opcao = curto.next().charAt(0);
						
						switch (opcao) {
						
						case '0':	break;
						
						case '1':
							System.out.println("");
							System.out.println(" ------------------------------------- ");
							System.out.println("|         LISTAR FUNCIONÁRIOS         |");
							System.out.println(" ------------------------------------- ");
							System.out.println("");
							
							lista = locadora.listarFuncionarios();
							for (Iterator iterator = lista.iterator(); iterator.hasNext();) {
								Funcionario funcionarios = (Funcionario) iterator.next();
								System.out.println(locadora.funcionarioResumo(funcionarios));
							}
							break;
					
						case '2':
							System.out.println("");
							System.out.println(" ------------------------------------- ");
							System.out.println("|        CADASTRAR FUNCIONÁRIO        |");
							System.out.println(" ------------------------------------- ");
							System.out.println("");
							
							do {
								System.out.println("Digite o nome do funcionário");
								System.out.print("> ");
								nome = longo.nextLine();
							} while (nome.isEmpty());
							Funcionario novo = new Funcionario(nome);
							
							do {
								System.out.println("\nDigite o nome de usuário do funcionário - não deve conter espaço");
								System.out.print("> ");
								novoLogin = curto.next();
							} while (novoLogin.isEmpty());
							
							do {
								System.out.println("\nDigite a senha do funcionário - não deve conter espaço");
								System.out.print("> ");
								novaSenha = curto.next();
							} while (novaSenha.isEmpty());
							
							locadora.cadastrarFuncionario(novo, novoLogin, novaSenha);
							System.out.println("\n[+] Funcionário cadastrado!");
							break;
							
						default:
							System.out.println("\n[!] Opção inválida");
							ok = false;
						}
						
					} while (!ok);
					break;
					
	/*\
	 *	OPÇÃO 2	--	CLIENTES
	\*/		
				case '2':
					do {
						ok = true;
						
						System.out.println("");
						System.out.println(" ____________________________");
						System.out.println("|                            |");
						System.out.println("|          CLIENTES          |");
						System.out.println("|____________________________|");
						System.out.println("|                            |");
						System.out.println("| 1 - Listar clientes        |");
						System.out.println("| 2 - Cadastrar cliente      |");
						System.out.println("|                            |");
						System.out.println("| 0 - Voltar                 |");
						System.out.println("|____________________________|");
						System.out.println("");
						
						System.out.println("Digite a opção desejada");
						System.out.print("> ");
						opcao = curto.next().charAt(0);
						
						switch (opcao) {
						
						case '0':	break;
						
						case '1':
							System.out.println("");
							System.out.println(" ------------------------------------- ");
							System.out.println("|           LISTAR CLIENTES           |");
							System.out.println(" ------------------------------------- ");
							System.out.println("");
							
							lista = locadora.listarClientes();
							for (Iterator iterator = lista.iterator(); iterator.hasNext();) {
								Cliente clientes = (Cliente) iterator.next();
								System.out.println(locadora.clienteResumo(clientes));
							}
							break;
						
						case '2':
							System.out.println("");
							System.out.println(" ------------------------------------- ");
							System.out.println("|          CADASTRAR CLIENTE          |");
							System.out.println(" ------------------------------------- ");
							System.out.println("");
							
							System.out.println("Pessoa Física ou Jurídica?");
							System.out.print("> ");
							letra = curto.next().charAt(0);
							ok = false;
							
							do {
							
								switch (letra) {
							
								case 'f': case 'F':
									ok = true;
									System.out.println("\n*** PESSOA FÍSICA");
									
									do {
										System.out.println("\nDigite o nome do cliente");
										System.out.print("> ");
										nome = longo.nextLine();
									} while (nome.isEmpty());
									ClientePessoaFisica novoCliente = new ClientePessoaFisica(nome);
									
									System.out.println("\nDigite o endereço do cliente");
									System.out.print("> ");
									endereco = longo.nextLine();
									novoCliente.setEndereco(endereco);
									System.out.println("\nDigite o telefone do cliente");
									System.out.print("> ");
									telefone = longo.nextLine();
									novoCliente.setTelefone(telefone);
									
									ok = false;
									do {
										try {
											System.out.println("\nDigite o CPF do cliente");
											System.out.print("> ");
											cpf = longo.nextLine();
											locadora.validarCpf(cpf);
											ok = true;
											novoCliente.setCpf(cpf);
										} catch (CpfInvalidoException e) {
											System.out.println(e.getMessage());
										}
									} while (!ok);
									
									do {
										System.out.println("\nDigite o número de identidade do cliente");
										System.out.print("> ");
										id = longo.nextLine();	
									} while (id.isEmpty());
									novoCliente.setIdentidade(id);
									
									ok = false;
									do {
										try {
											System.out.println("\nDigite a idade do cliente");
											System.out.print("> ");
											idade = curto.nextInt();
											locadora.validarIdadeCliente(idade);
											ok = true;
											novoCliente.setIdade(idade);
										} catch (IdadeNaoPermitidaException e) {
											System.out.println(e.getMessage());
										}
									} while (!ok);
										
									locadora.clientes.add(novoCliente);
									System.out.println("\n[+] Cliente cadastrado!");
									break;
								
								case 'j': case 'J':
									ok = true;
									System.out.println("\n*** PESSOA JURÍDICA");
									
									do {
										System.out.println("\nDigite o nome da empresa");
										System.out.print("> ");
										nome = longo.nextLine();
									} while (nome.isEmpty());
									ClientePessoaJuridica novaEmpresa = new ClientePessoaJuridica(nome);
									
									System.out.println("\nDigite o endereço da empresa");
									System.out.print("> ");
									endereco = longo.nextLine();
									novaEmpresa.setEndereco(endereco);
									System.out.println("\nDigite o telefone da empresa");
									System.out.print("> ");
									telefone = longo.nextLine();
									novaEmpresa.setTelefone(telefone);
									
									ok = false;
									do {
										try {
											System.out.println("\nDigite o CNPJ da empresa");
											System.out.print("> ");
											cnpj = longo.nextLine();
											locadora.validarCnpj(cnpj);
											ok = true;
											novaEmpresa.setCnpj(cnpj);
										} catch (CnpjInvalidoException e) {
											System.out.println(e.getMessage());
										}
									} while (!ok);
									
									System.out.println("\nDigite o nome do responsável pela empresa");
									System.out.print("> ");
									resp = longo.nextLine();
									novaEmpresa.setResponsavel(resp);
									
									locadora.clientes.add(novaEmpresa);
									System.out.println("\n[+] Cliente cadastrado!");
									break;
								
								default:
									System.out.println("\n[!] Entrada inválida. Digite 'F' ou 'J'");
									System.out.print("> ");
									letra = curto.next().charAt(0);
								}
							
							} while (!ok);
							break;
							
						default:
							System.out.println("\n[!]Opção inválida");
							ok = false;
						}
				
				} while(!ok);
				break;
	/*\
	 *	OPÇÃO 3	--	CARROS	
	\*/				
					
				case '3':
					do {
					ok = true;
					
					System.out.println("");
					System.out.println(" ____________________________");
					System.out.println("|                            |");
					System.out.println("|           CARROS           |");
					System.out.println("|____________________________|");
					System.out.println("|                            |");
					System.out.println("| 1 - Listar carros          |");
					System.out.println("| 2 - Cadastrar carro        |");
					System.out.println("|                            |");
					System.out.println("| 0 - Voltar                 |");
					System.out.println("|____________________________|");
					System.out.println("");
					
					System.out.println("Digite a opção desejada");
					System.out.print("> ");
					opcao = curto.next().charAt(0);
					
					switch (opcao) {
					
					case '0':	break;
					
					case '1':
						
						do {
						
							ok = true;
							
							System.out.println("");
							System.out.println(" ____________________________");
							System.out.println("|                            |");
							System.out.println("|       LISTAR  CARROS       |");
							System.out.println("|____________________________|");
							System.out.println("|                            |");
							System.out.println("| 1 - Todos os carros        |");
							System.out.println("| 2 - Carros disponíveis     |");
							System.out.println("| 3 - Carros alugados        |");
							System.out.println("| 4 - Carros reservados      |");
							System.out.println("|                            |");
							System.out.println("| 0 - Voltar                 |");
							System.out.println("|____________________________|");
							System.out.println("");
							
							System.out.println("Digite a opção desejada");
							System.out.print("> ");
							opcao = curto.next().charAt(0);
							
							switch (opcao) {
							
							case '0':	break;
							
							case '1':
								System.out.println("");
								System.out.println(" ------------------------------------- ");
								System.out.println("|           TODOS OS CARROS           |");
								System.out.println(" ------------------------------------- ");
								System.out.println("");
								
								lista = locadora.listarCarros();
								for (Iterator iterator = lista.iterator(); iterator.hasNext();) {
									Carro carros = (Carro) iterator.next();
									System.out.println(locadora.carroResumo(carros));
								}
								break;
								
							case '2':
								System.out.println("");
								System.out.println(" ------------------------------------- ");
								System.out.println("|         CARROS  DISPONÍVEIS         |");
								System.out.println(" ------------------------------------- ");
								System.out.println("");
								
								lista = locadora.listarDisponiveis();
								if (lista == null) {
									System.out.println("\n[!] Nenhum carro disponível no momento");
									break;
								}
								
								for (Iterator iterator = lista.iterator(); iterator.hasNext();) {
									Carro carros = (Carro) iterator.next();
									System.out.println(locadora.carroResumo(carros));
								}
								break;
								
							case '3':
								System.out.println("");
								System.out.println(" ------------------------------------- ");
								System.out.println("|           CARROS ALUGADOS           |");
								System.out.println(" ------------------------------------- ");
								System.out.println("");
								
								lista = locadora.listarAlugados();
								if (lista == null) {
									System.out.println("\n[!] Nenhum carro alugado no momento");
									break;
								}
								
								for (Iterator iterator = lista.iterator(); iterator.hasNext();) {
									Carro carros = (Carro) iterator.next();
									System.out.println(locadora.carroResumo(carros));
								}							
								break;
								
							case '4':
								System.out.println("");
								System.out.println(" ------------------------------------- ");
								System.out.println("|          CARROS RESERVADOS          |");
								System.out.println(" ------------------------------------- ");
								System.out.println("");
								
								lista = locadora.listarReservados();
								if (lista == null) {
									System.out.println("\n[!] Nenhum carro reservado no momento");
									break;
								}
								
								for (Iterator iterator = lista.iterator(); iterator.hasNext();) {
									Carro carros = (Carro) iterator.next();
									System.out.println(locadora.carroResumo(carros));
								}							
								break;
	
							default:
								System.out.println("\n[!] Opção inválida");
								ok = false;
								break;
							}
						
						} while (!ok);
						break;
						
					case '2':
						
						do {
							
							System.out.println("");
							System.out.println(" ____________________________");
							System.out.println("|                            |");
							System.out.println("|      CADASTRAR  CARRO      |");
							System.out.println("|____________________________|");
							System.out.println("|                            |");
							System.out.println("| 1 - Popular                |");
							System.out.println("| 2 - Médio                  |");
							System.out.println("| 3 - Luxo                   |");
							System.out.println("| 4 - Utilitário             |");
							System.out.println("|                            |");
							System.out.println("| 0 - Voltar                 |");
							System.out.println("|____________________________|");
							System.out.println("");
							
							System.out.println("Digite a opção desejada");
							System.out.print("> ");
							opcao = curto.next().charAt(0);
							
							switch (opcao) {
							
							case '0':	ok = true; break;
							
							case '1':
								System.out.println("\n*** CARRO POPULAR");
								ok = true;
								CarroPopular popular = new CarroPopular();
								
								ok = false;
								do {
									try {
										System.out.println("\nQual a placa?");
										System.out.print("> ");
										placa = longo.nextLine();
										locadora.validarPlaca(placa);
										ok = true;
										popular.setPlaca(placa);
									} catch (PlacaExistenteException e) {
										System.out.println(e.getMessage());
									} catch (PlacaFormatoInvalidoException e) {
										System.out.println(e.getMessage());
									}
								} while (!ok);
								
								do {
									System.out.println("\nQual o modelo?");
									System.out.print("> ");
									modelo = longo.nextLine();
								} while (modelo.isEmpty());
								popular.setModelo(modelo);
								
								do {
									System.out.println("\nQual a cor?");
									System.out.print("> ");
									cor = longo.nextLine();
								} while (cor.isEmpty());
								popular.setCor(cor);
								
								locadora.adicionar(popular);
								System.out.println("\n[+] Carro cadastrado!");
								break;
								
							case '2':
								System.out.println("\n*** CARRO MÉDIO");
								ok = true;
								CarroMedio medio = new CarroMedio();
								
								ok = false;
								do {
									try {
										System.out.println("\nQual a placa?");
										System.out.print("> ");
										placa = longo.nextLine();
										locadora.validarPlaca(placa);
										ok = true;
										medio.setPlaca(placa);
									} catch (PlacaExistenteException e) {
										System.out.println(e.getMessage());
									} catch (PlacaFormatoInvalidoException e) {
										System.out.println(e.getMessage());
									}
								} while (!ok);
								
								do {
									System.out.println("\nQual o modelo?");
									System.out.print("> ");
									modelo = longo.nextLine();
								} while (modelo.isEmpty());
								medio.setModelo(modelo);
								
								do {
									System.out.println("\nQual a cor?");
									System.out.print("> ");
									cor = longo.nextLine();
								} while (cor.isEmpty());
								medio.setCor(cor);
								
								locadora.adicionar(medio);
								System.out.println("\n[+] Carro cadastrado!");
								break;
								
							case '3':
								System.out.println("\n*** CARRO LUXO");
								ok = true;
								CarroLuxo luxo = new CarroLuxo();
								
								ok = false;
								do {
									try {
										System.out.println("\nQual a placa?");
										System.out.print("> ");
										placa = longo.nextLine();
										locadora.validarPlaca(placa);
										ok = true;
										luxo.setPlaca(placa);
									} catch (PlacaExistenteException e) {
										System.out.println(e.getMessage());
									} catch (PlacaFormatoInvalidoException e) {
										System.out.println(e.getMessage());
									}
								} while (!ok);
								
								do {
									System.out.println("\nQual o modelo?");
									System.out.print("> ");
									modelo = longo.nextLine();
								} while (modelo.isEmpty());
								luxo.setModelo(modelo);
								
								do {
									System.out.println("\nQual a cor?");
									System.out.print("> ");
									cor = longo.nextLine();
								} while (cor.isEmpty());
								luxo.setCor(cor);
								
								locadora.adicionar(luxo);
								System.out.println("\n[+] Carro cadastrado!");
								break;
								
							case '4':
								System.out.println("\n*** CARRO UTILITÁRIO");
								ok = true;
								CarroUtilitario utilitario = new CarroUtilitario();
								
								ok = false;
								do {
									try {
										System.out.println("\nQual a placa?");
										System.out.print("> ");
										placa = longo.nextLine();
										locadora.validarPlaca(placa);
										ok = true;
										utilitario.setPlaca(placa);
									} catch (PlacaExistenteException e) {
										System.out.println(e.getMessage());
									} catch (PlacaFormatoInvalidoException e) {
										System.out.println(e.getMessage());
									}
								} while (!ok);
								
								do {
									System.out.println("\nQual o modelo?");
									System.out.print("> ");
									modelo = longo.nextLine();
								} while (modelo.isEmpty());
								utilitario.setModelo(modelo);
								
								do {
									System.out.println("\nQual a cor?");
									System.out.print("> ");
									cor = longo.nextLine();
								} while (cor.isEmpty());
								utilitario.setCor(cor);
								
								locadora.adicionar(utilitario);
								System.out.println("\n[+] Carro cadastrado!");							
								break;
								
							default:
								System.out.println("\n[!] Opção inválida");
								ok = false;
							}
														
						} while (!ok);
						break;
						
					default:
						System.out.println("\n[!] Opção inválida");
						ok = false;						
					}
					
				} while (!ok);
				break;
		
	/*\
	 *	OPÇÃO 4	--	RESERVA	
	\*/									
				case '4':
					do {
					ok = true;
					
					System.out.println("");
					System.out.println(" ____________________________");
					System.out.println("|                            |");
					System.out.println("|          RESERVA           |");
					System.out.println("|____________________________|");
					System.out.println("|                            |");
					System.out.println("| 1 - Reservar carro         |");
					System.out.println("| 2 - Listar reservas        |");
					System.out.println("| 3 - Cancelar reserva       |");
					System.out.println("| 4 - Efetivar reserva       |");
					System.out.println("|                            |");
					System.out.println("| 0 - Voltar                 |");
					System.out.println("|____________________________|");
					System.out.println("");
					
					System.out.println("Digite a opção desejada");
					System.out.print("> ");
					opcao = curto.next().charAt(0);
					
					switch (opcao) {
					
					case '0': break;
					
					case '1':
						System.out.println("");
						System.out.println(" ------------------------------------- ");
						System.out.println("|           RESERVAR  CARRO           |");
						System.out.println(" ------------------------------------- ");
						System.out.println("");
						
						lista = locadora.listarDisponiveis();
						if (lista == null) {
							System.out.println("\n[!] Nenhum carro disponível no momento");
							break;
						}
						
						for (Iterator iterator = lista.iterator(); iterator.hasNext();) {
							Carro carros = (Carro) iterator.next();
							System.out.println(locadora.carroResumo(carros));
						}
						
						ok = false;
						do {
							try {
								System.out.println("\nDigite a placa do carro desejado");
								System.out.print("> ");
								placa = longo.nextLine();
								carro = locadora.getCarro(placa);
								ok = true;
							} catch (PlacaInexistenteException e) {
								System.out.println(e.getMessage());
							}
						} while (!ok);
						
						if (locadora.disponivel(carro)) {
							System.out.println("");
							System.out.println("MODELO: " + carro.getModelo());
							System.out.println("COR: " + carro.getCor());
							System.out.println("PLACA: " + carro.getPlaca());
							System.out.println("DIÁRIA: R$ " + carro.getValorDiaria() + ",00");
						} else {
							System.out.println("\n[!] Carro não disponível");
							break;
						}
						
						System.out.println("\nDigite o nome ou CPF/CNPJ do cliente");
						System.out.print("> ");
						string = longo.nextLine();
						
						if (locadora.getCliente(string) != null) {	
							cliente = locadora.getCliente(string);
						} else {
							System.out.println("\n[!] Cliente não encontrado");
							break;							
							
						}
						
						ok = false;
						do {
							System.out.println("\nDigite a data prevista para a retirada (dd/mm/aaaa)");
							System.out.print("> ");
							string = longo.nextLine();
							
							try {
								data = formatoData.parse(string);
								locadora.validarDataRetirada(data);
								ok = true;
							} catch (DataExcedidaException e) {
								System.out.println(e.getMessage());
							} catch (Exception e) {
								System.out.println("\n[!] Data em formato inválido");
							}
						} while (!ok);
						
						System.out.println("");
						System.out.println("******** RESERVA ********");
						System.out.println("");
						System.out.println("CLIENTE");
						System.out.println(locadora.clienteResumo(cliente));
						System.out.println("CARRO");
						System.out.println(locadora.carroResumo(carro)); 
						System.out.println("PREVISÃO DE RETIRADA");
						System.out.println("* " + formatoData.format(data));
						System.out.println("_________________________");
						
						do {
						ok = true;
						
						System.out.println("\nCONFIRMAR RESERVA?");
						System.out.print("> ");
						letra = curto.next().charAt(0);
						
						switch (letra) {
						
						case 's': case 'S': case 'y': case 'Y':
							locadora.reservar(carro, cliente, data);
							System.out.println("\n[+] Reserva realizada com sucesso!");
							break;
						
						case 'n': case 'N':
							System.out.println("\n[!] Reserva abortada pelo usuário!");
							break;

						default:
							System.out.println("\n[!] Entrada inválida. Digite 'S' ou 'N'");
							ok = false;
							break;
						}
						
					} while (!ok);
					break;
						
					case '2':
						System.out.println("");
						System.out.println(" ------------------------------------- ");
						System.out.println("|           LISTAR RESERVAS           |");
						System.out.println(" ------------------------------------- ");
						System.out.println("");
						
						lista = locadora.listarReservas();
						if (lista == null) {
							System.out.println("\n[!] Nenhuma reserva no momento");
							break;
						}
						
						for (Iterator iterator = lista.iterator(); iterator.hasNext();) {
							Reserva reservas = (Reserva) iterator.next();
							System.out.println(locadora.reservaResumo(reservas));
							System.out.println("_________________________");
							System.out.println("");
						}
						break;
						
					case '3':
						System.out.println("");
						System.out.println(" ------------------------------------- ");
						System.out.println("|          CANCELAR  RESERVA          |");
						System.out.println(" ------------------------------------- ");
						System.out.println("");
												
						ok = false;
						do {
							try {
								System.out.println("\nDigite a placa do carro desejado");
								System.out.print("> ");
								placa = longo.nextLine();
								carro = locadora.getCarro(placa);
								ok = true;
							} catch (PlacaInexistenteException e) {
								System.out.println(e.getMessage());
							}
						} while (!ok);
						
						Reserva reserva = locadora.getReserva(carro);
						if (reserva != null) {
							System.out.println("");
							System.out.println(locadora.reservaResumo(reserva));
							
							do{
							ok = true;
							
							System.out.println("\nCONFIRMAR CANCELAMENTO?");
							System.out.print("> ");
							letra = curto.next().charAt(0);
							
							switch (letra) {
							
							case 's': case 'S': case 'y': case 'Y':
								locadora.cancelarReserva(locadora.getReserva(carro));
								System.out.println("\n[+] Reserva cancelada com sucesso!");
								break;
							
							case 'n': case 'N':
								System.out.println("\n[!] Reserva não cancelada");
								break;

							default:
								System.out.println("\n[!] Entrada inválida. Digite 'S' ou 'N'");
								ok = false;
								break;
							}
							
							} while (!ok);
							break;
							
							
						} else {
							System.out.println("\n[!] Reserva não encontrada");
						}
						break;							
						
					case '4':
						System.out.println("");
						System.out.println(" ------------------------------------- ");
						System.out.println("|          EFETIVAR  RESERVA          |");
						System.out.println(" ------------------------------------- ");
						System.out.println("");
						
						ok = false;
						do {
							try {
								System.out.println("\nDigite a placa do carro desejado");
								System.out.print("> ");
								placa = longo.nextLine();
								carro = locadora.getCarro(placa);
								ok = true;
							} catch (PlacaInexistenteException e) {
								System.out.println(e.getMessage());
							}
						} while (!ok);
						
						Reserva reserva2 = locadora.getReserva(carro);
						if (reserva2 != null) {
							System.out.println("");
							System.out.println(locadora.reservaResumo(reserva2));
							
							do{
							ok = true;
								
							System.out.println("\nCONFIRMAR ALUGUEL?");						
							System.out.print("> ");
							letra = curto.next().charAt(0);
														
							switch (letra) {
							
							case 's': case 'S': case 'y': case 'Y':
								locadora.alugar(locadora.getReserva(carro));
								locadora.cancelarReserva(locadora.getReserva(carro));
								System.out.println("\n[+] Aluguel realizado com sucesso!");
								break;
							
							case 'n': case 'N':
								System.out.println("\n[!] Aluguel não realizado");
								break;

							default:
								System.out.println("\n[!] Entrada inválida. Digite 'S' ou 'N'");
								ok = false;
								break;
							}
							
							} while (!ok);
							break;
							
							
						} else {
							System.out.println("\n[!] Reserva não encontrada");
						}
						break;
					
					default:
						System.out.println("\n[!] Opção inválida");
						 ok = false;						
					}
					
				} while (!ok);
				break;
					
					
	/*\
	 *	OPÇÃO 5	--	ALUGUEL	
	\*/	
					
				case '5':
					do{
						ok = true;
						
						System.out.println("");
						System.out.println(" ____________________________");
						System.out.println("|                            |");
						System.out.println("|          ALUGUEL           |");
						System.out.println("|____________________________|");
						System.out.println("|                            |");
						System.out.println("| 1 - Alugar carro           |");
						System.out.println("| 2 - Listar aluguéis        |");
						System.out.println("| 3 - Reservas para hoje     |");
						System.out.println("|                            |");
						System.out.println("| 0 - Voltar                 |");
						System.out.println("|____________________________|");
						System.out.println("");
						
						System.out.println("Digite a opção desejada");
						System.out.print("> ");
						opcao = curto.next().charAt(0);
						
						switch (opcao) {
						
						case '0': break;
						
						case '1':
							System.out.println("");
							System.out.println(" ------------------------------------- ");
							System.out.println("|            ALUGAR  CARRO            |");
							System.out.println(" ------------------------------------- ");
							System.out.println("");
							
							lista = locadora.listarDisponiveis();
							if (lista == null) {
								System.out.println("\n[!] Nenhum carro disponível no momento");
								break;
							}
							
							for (Iterator iterator = lista.iterator(); iterator.hasNext();) {
								Carro carros = (Carro) iterator.next();
								System.out.println(locadora.carroResumo(carros));
							}
							
							ok = false;
							do {
								try {
									System.out.println("\nDigite a placa do carro desejado");
									System.out.print("> ");
									placa = longo.nextLine();
									carro = locadora.getCarro(placa);
									ok = true;
								} catch (PlacaInexistenteException e) {
									System.out.println(e.getMessage());
								}
							} while (!ok); 
							
							if (locadora.reservado(carro)) {
								cliente = locadora.getReserva(carro).getCliente();
								System.out.println("");
								System.out.println("******** RESERVA ********");
								System.out.println("");
								System.out.println("CLIENTE");
								System.out.println(locadora.clienteResumo(cliente));
								System.out.println("CARRO");
								System.out.println(locadora.carroResumo(carro)); 
								System.out.println("_________________________");
								
								do{
									ok = true;
									
									System.out.println("\nCONFIRMAR ALUGUEL?");
									System.out.print("> ");
									letra = curto.next().charAt(0);
																			
									switch (letra) {
									
									case 's': case 'S': case 'y': case 'Y':
										locadora.alugar(carro, cliente);
										locadora.cancelarReserva(locadora.getReserva(carro));
										System.out.println("\n[+] Aluguel realizado com sucesso!");
										break;
									
									case 'n': case 'N':
										System.out.println("\n[!] Aluguel abortado pelo usuário!");
										break;
		
									default:
										System.out.println("\n[!] Entrada inválida. Digite 'S' ou 'N'");
										ok = false;
										break;
									}
								} while (!ok);
								break;
								
							} else if (locadora.disponivel(carro)) {
								System.out.println("");
								System.out.println("MODELO: " + carro.getModelo());
								System.out.println("COR: " + carro.getCor());
								System.out.println("PLACA: " + carro.getPlaca());
								System.out.println("DIÁRIA: R$ " + carro.getValorDiaria() + ",00");
							} else {
								System.out.println("\n[!] Carro não disponível");
								break;
							}
							
							System.out.println("\nDigite o nome ou CPF/CNPJ do cliente");
							System.out.print("> ");
							string = longo.nextLine();
							
							if (locadora.getCliente(string) != null) {	
								cliente = locadora.getCliente(string);
							} else {
								System.out.println("\n[!] Cliente não encontrado");
								break;
							}
							
							System.out.println("");
							System.out.println("******** ALUGUEL ********");
							System.out.println("");
							System.out.println("CLIENTE");
							System.out.println(locadora.clienteResumo(cliente));
							System.out.println("CARRO");
							System.out.println(locadora.carroResumo(carro)); 
							System.out.println("_________________________");
							
							do{
								ok = true;
							
								System.out.println("\nCONFIRMAR ALUGUEL?");
								System.out.print("> ");
								letra = curto.next().charAt(0);
								
								switch (letra) {
								
								case 's': case 'S': case 'y': case 'Y':
									locadora.alugar(carro, cliente);
									System.out.println("\n[+] Aluguel realizado com sucesso!");
									break;
								
								case 'n': case 'N':
									System.out.println("\n[!] Aluguel abortado pelo usuário!");
									break;
		
								default:
									System.out.println("\n[!] Entrada inválida. Digite 'S' ou 'N'");
									ok = false;
									break;
								}
							} while (!ok);
							break;
																						
						case '2':
							System.out.println("");
							System.out.println(" ------------------------------------- ");
							System.out.println("|           LISTAR ALUGUÉIS           |");
							System.out.println(" ------------------------------------- ");
							System.out.println("");
							
							lista = locadora.listarAlugueis();
							if (lista == null) {
								System.out.println("\n[!] Nenhum aluguel no momento");
								break;
							}		
							
							for (Iterator iterator = lista.iterator(); iterator.hasNext();) {
								Aluguel alugueis = (Aluguel) iterator.next();
								System.out.println(locadora.aluguelResumo(alugueis));
								System.out.println("_________________________");
								System.out.println("");
							}
							
							break;
							
						case '3':
							System.out.println("");
							System.out.println(" ------------------------------------- ");
							System.out.println("|         RESERVAS PARA HOJE          |");
							System.out.println(" ------------------------------------- ");
							System.out.println("");
							
							lista = locadora.listarReservasParaHoje();
							if (lista == null) {
								System.out.println("\n[!] Nenhuma reserva para hoje");
								break;
							}
							
							for (Iterator iterator = lista.iterator(); iterator.hasNext();) {
								Reserva reservas = (Reserva) iterator.next();
								System.out.println(locadora.reservaResumo(reservas));
								System.out.println("_________________________");
								System.out.println("");
							}
							break;
	
						default:
							System.out.println("\n[!] Opção inválida");
							ok = false;
							break;
						}
				} while (!ok);
				break;
					
	/*\
	 *	OPÇÃO 6	--	DEVOLUÇÃO	
	\*/						
					
				case '6':
					System.out.println("");
					System.out.println(" ------------------------------------- ");
					System.out.println("|              DEVOLUÇÃO              |");
					System.out.println(" ------------------------------------- ");
					System.out.println("");
					
					ok = false;
					do {
						try {
							System.out.println("\nDigite a placa do carro desejado");
							System.out.print("> ");
							placa = longo.nextLine();
							carro = locadora.getCarro(placa);
							ok = true;
						} catch (PlacaInexistenteException e) {
							System.out.println(e.getMessage());
						}
					} while (!ok);
					
					Aluguel aluguel = locadora.getAluguel(carro);
					if (aluguel != null) {
						System.out.println("");
						System.out.println(locadora.aluguelResumo(aluguel));
						
						System.out.println("\nCONFIRMAR DEVOLUÇÃO?");
						System.out.print("> ");
						letra = curto.next().charAt(0);
						
						switch (letra) {
						
						case 's': case 'S': case 'y': case 'Y':
							valor = locadora.devolver(locadora.getAluguel(carro));
							System.out.println("\n[+] Carro devolvido com sucesso!");
							System.out.println("\n*** VALOR TOTAL: R$ " + valor + "0");
							break;
						
						case 'n': case 'N':
							System.out.println("\n[!] Carro não devolvido");
							break;

						default:
							System.out.println("\n[!] Entrada inválida. Digite 'S' ou 'N'");
							break;
						}
						
						
					} else {
						System.out.println("\n[!] Aluguel não encontrado");
					}
					break;
					
	/*\
	 *	OPÇÃO 7	--	FAZER LOGOFF	
	\*/						
					
				case '7':
					System.out.println("\nAté mais, " + funcionario.getNome());
					logado = false;
					break;
					
	/*\
	 *	OPÇÃO 8	--	DESLIGAR SISTEMA	
	\*/						
					
				case '8':
					sair = true;
					logado = false;
					System.out.println("\nDesligando o sistema...");
					break;
	
	/*\
	 *	DEFAULT	--	OPÇÃO INVÁLIDA	
	\*/					
					
				default:
					System.out.println("\n[!] Opção inválida");
					break;
				} // 	--	FIM DO SWITCH (MENU PRINCIPAL)
				
			}	//	--	FIM DA VERIFICAÇÃO DE USUÁRIO
				
		} while (!sair);
		
	}	//	--	FIM DO MÉTODO MAIN
	
}	//	--	FIM DA CLASSE
